<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>

//【示例1】在下面示例中，演示如何定义一个构造函数，并为实例对象定义本地属性。
function f(){	// 声明一个构造类型
    this.a = 1; 	// 为构造类型声明一个本地属性
    this.b = function(){	// 为构造类型声明一个本地方法
        return this.a;
    };
}
var e =new f();	// 实例化构造类型
alert(e.a); 	// 调用实例对象的属性a，返回1
alert(e.b());	// 调用实例对象的方法b，提示1

e.a = 2;
alert(e.a);
alert(e.b());
//【示例2】本地属性可以在实例对象中被修改，但是不同实例对象之间不会相互干扰。
function f(){	// 声明一个构造类型
    this.a = 1; 	// 为构造类型声明一个本地属性
}
var e =new f();	// 实例e
var g =new f();	// 实例g
alert(e.a); 	// 返回值为1，说明它继承了构造函数的初始值
alert(g.a); 	// 返回值为1，说明它继承了构造函数的初始值
e.a = 2; 	// 修改实例e的属性a的值
alert(e.a); 	// 返回值为2，说明实例e的属性a的值改变了
alert(g.a); 	// 返回值为1，说明实例g的属性a的值没有受影响
//【示例3】原型属性将会影响所有实例对象，修改任何原型属性值，则该构造函数的所有实例都会看到这种变化，这样就避免了本地属性修改的麻烦。
function f(){	// 声明一个构造类型
    f.prototype.a = 1; 	// 为构造类型声明一个原型属性
}
var e =new f();	// 实例e
var g =new f();	// 实例g
alert(e.a); 	// 返回值为1，说明它继承了构造函数的初始值
alert(g.a); 	// 返回值为1，说明它继承了构造函数的初始值
f.prototype.a = 2; 	// 修改原型属性值
alert(e.a); 	// 返回值为2，说明实例e的属性a的值改变了
alert(g.a); 	// 返回值为2，说明实例g的属性a的值改变了

function f(){}	// 声明一个空的构造类型
f.prototype.a = 1; 	// 在结构体外为构造类型声明一个原型属性
f.prototype.b = function(){	// 在结构体外为构造类型声明一个原型方法
    return f.prototype.a; 	// 返回原型属性值
}
///【示例4】利用对象原型与本地属性之间这种特殊关系，可以设计如下有趣的演示效果。
function p(x,y,z){ 	// 构造函数
    this.x = x; 	// 声明本地属性x并赋参数x的值
    this.y = y; 	// 声明本地属性y并赋参数y的值
    this.z = z; 	// 声明本地属性z并赋参数z的值
}
p.prototype.del = function(){	// 定义原型方法
    for(var i in this){ 	// 遍历本地对象，删除实例对象内的所有属性和方法
        delete this[i];
    }
}
p.prototype = new p(1,2,3); 	// 实例化构造函数p，并把实例对象传递给原型对象
var p1 = new p(10,20,30); 	// 实例化构造函数p为p1
alert(p1.x); 	// 返回10，本地属性x的值
alert(p1.y); 	// 返回20，本地属性y的值
alert(p1.z); 	// 返回30，本地属性z的值
p1.del();	// 调用原型方法，删除所有本地属性
alert(p1.x); 	// 返回1，原型属性x的值
alert(p1.y); 	// 返回2，原型属性y的值
alert(p1.z); 	// 返回3，原型属性z的值

</script>
</head>

<body>
</body>
</html>
